<?php
namespace app\common\tool;

require APP_PATH."/../vendor/oss-sdk/autoload.php";
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Core\OssUtil;

class OSSUtils
{
    protected $cnameEndpoint;
    protected $accessKeyId;
    protected $accessKeySecret;
    protected $bucket;
    protected $ImageUrl;
    public $ossClient;


    public function __construct()
    {
        $this->accessKeyId = config('OSS_ACCESS_ID');
        $this->accessKeySecret = config('OSS_ACCESS_KEY');
        //存储空间
        $this->bucket = config('OSS_BUCKET');
        //使用自定义域名的访问地址
        $this->cnameEndpoint = config('OSS_CNAME_ENDPOINT');
        //图片访问域名
        $this->ImageUrl = "http://".$this->cnameEndpoint;
        try {
            //使用自定义域名
            $this->ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->cnameEndpoint, true);
        }catch (OssException $e) {
            return $this->json_export(0, '无法开启指定的存储空间，请检查oss服务：'.$e->getMessage(), '');
        }
    }

    /**
     * json返回
     */
    private function json_export($status,$msg,$data=[]){
        $ret_arr = [
            'status' => $status,//0错误 1成功
            'msg' => $msg,
            'data' => (empty($data) ? "" : $data),
        ];
        return json_encode($ret_arr);
    }

    /**
     * 上传文件到指定bucket
     * @param $object_path 对象名，在bucket中的完整路径加名称，如：img/goods/main/name.jpg
     * @param $file 实际上传文件，文件对象
     */
    public function uploadFile($object_name,$file)
    {
        try{
            //路径不存在会自动创建
            $this->ossClient->uploadFile($this->bucket, $object_name, $file);
        } catch(OssException $e) {
            return $this->json_export(0, "上传失败：".$e->getMessage(), '');
        }
        return $this->json_export(1, '上传成功', '');
    }

    /**
     * 删除bucket中的指定文件
     * @param $object_name 对象名，在bucket中的完整路径加名称，如：img/goods/main/name.jpg
     */
    public function deleteFile($object_name)
    {
        try{
            $this->ossClient->deleteObject($this->bucket, $object_name);
        } catch(OssException $e) {
            return $this->json_export(0, "删除失败：".$e->getMessage(), '');
        }
        return $this->json_export(1, '删除成功', '');
    }

    /**
     * 批量删除bucket中的指定文件
     * @param $object_names 对象名，在bucket中的完整路径加名称，如：array("b.file", "c.file")
     */
    public function deleteFiles($object_names = array())
    {
        try{
            $this->ossClient->deleteObjects($this->bucket, $object_names);
        } catch(OssException $e) {
            return $this->json_export(0, "批量删除失败：".$e->getMessage(), '');
        }
        return $this->json_export(1, '批量删除成功', '');
    }

    /**
     * 批量删除bucket中的指定文件
     * @param $object_names 对象名，在bucket中的完整路径加名称，如：img/goods/main/name.jpg
     * @param $options 操作参数，默认为null，可以设置获取特殊处理的图片文件，如缩放，裁剪
     */
    public function getFile($object_names,$options)
    {
        try{
            $this->ossClient->getObject($this->bucket, $object_names,$options);
        } catch(OssException $e) {
            return $this->json_export(0, "预处理文件获取失败：".$e->getMessage(), '');
        }
        return $this->json_export(1, '预处理文件获取成功', '');
    }
}